<?php
  /**
   * @author EVANDRO DE OLIVEIRA.
   * @category MODEL
   * @package MODELS.
   * @since 17/03/2012.
   * @last_update 24/03/2012.
   * @copyright 2012.
   * @version 1.0.
   *
   */
  class Application_Model_Turmas extends Zend_Db_Table_Abstract{
    const IND_ATIVO = 1;
    const IND_INATIVO = 0;
    
    /* Seta a tabela a ser usada*/
    protected function _setup(){
      $this->_name = 'turmas';
      
      parent::_setup();
    }
    
    /**
     * Retorna a string SELECT como todos os campos solicitados por parametro.
     * @param array Array com as opções de colunas e clausulá WHERE.
     *              Ex: Colunas:
     *                  $arrOptions['fields_perfil'] = array('campo1', 'campo2', 'campoN').
     *                  
     *                  WHERE
     *                    $arrOptions['where_clause'] = array('ds_peril' => 'usuario')
     * @param string  Comparação.Ex: =, LIKE NOT LIKE, etc  
     *                    
     * @return string                   
     */
     public function _get($arrOptions = array(), $strComparison = '='){
      $arrAlias     = array('t' => $this->_name);
      
      if(isset($arrOptions['fields']))
        $arrCols = $arrOptions['fields'];
      else
        $arrCols = array('t.*');
          
      $strSql = $this->getAdapter()
      ->select()
      ->from($arrAlias, $arrCols)
      ->where('t.ds_situacao = ?', self::IND_ATIVO)
      ;
      
      if(isset($arrOptions['where_clause']))
        foreach($arrOptions['where_clause'] as $strkey => $strValue)
          $strSql->where($strkey . $strComparison . ' ?', $strValue);  
      $strSql->order('t.idTurma');
      
      return $strSql;
    }
    
    /**
     * Retorna o registro
     * 
     * @param integer Id do registro
     * @return databasen result
     */
    public function get($intId = null){
    	
      if($intId == null)
        return false;

      $arrOptions['fields'] = array(
        't.idTurma',
        't.ds_sigla',
        't.idSala',
      	't.ds_turma',
      	't.idPeriodo',
        't.nr_limit',
      	't.ds_situacao',
      	's.ds_sala',
      	'p.ds_periodo',
        'm.idModulo',
        'm.ds_modulo',
      );
      
      $arrOptions['where_clause'] = array(
        't.idTurma'  => $intId,
             
      );
      
      $strSql = $this->_get($arrOptions)
      ->join(array('s'  =>  'salas'), 's.idSala = t.idSala', array())
      ->join(array('p'  =>  'periodos'), 'p.idPeriodo = t.idPeriodo', array()) 
      ->join(array('mt' =>  'modulos_turmas'), 'mt.idTurma = t.idTurma', array()) 
      ->join(array('m'  =>  'modulos'), 'm.idModulo = mt.idModulo', array());
       
      $objResult = $this->getAdapter()->fetchAll($strSql);
        
      return Core_Commons::onLoad($objResult);
    }
    
    public function validateLimit($intIdTurma){
      $arrResultTurmas = $this->fetchRow('idTurma = ' . $intIdTurma)->toArray();
      
      $objModelAlunos = new Application_Model_Alunos();
      $strSql = $objModelAlunos->select()
      ->setIntegrityCheck(false)
      ->from('alunos', array('total' => 'COUNT(idTurma)'))
      ->where('idTurma = ?', $intIdTurma);
       
      $arrCounterResult = $objModelAlunos->fetchRow($strSql)->toArray();
      if($arrCounterResult['total'] > $arrResultTurmas['nr_limit'])
        return false;
        
      return true;  
    }
    
    public function getAtivos(){
      $strSql = $this->select()->where($this->_name . '.ds_situacao = ?', self::ATIVO);
      
      $objResult = $this->fetchAll($strSql);
      
      return Core_Commons::onLoad($objResult);
    }
    
    /**
     * Retorna o resultado de acordo com o nome. 
     * 
     * @param string  Nome do menu
     * @param string  Nome da controller
     * 
     * @return database_result
     */
    public function getByNomeESigla($strDs, $strDs2){
      $arrOptions['fields'] = array(
        't.idTurma',
        't.ds_sigla',
       	't.ds_turma',
      );
            
      $arrOptions['where_clause'] = array(
        't.ds_situacao'  => self::IND_ATIVO         
      );
      
      if($strDs && $strDs2){
        $arrOptions['where_clause'] = array(
          't.ds_sigla'       => '%' . $strDs . '%',      
          't.ds_turma'       => '%' . $strDs2 . '%',         
        );   

        $strComparison = ' LIKE ';
      }  
      elseif($strDs && !$strDs2){ 
        $arrOptions['where_clause'] = array(
          't.ds_sigla'       => '%' . $strDs . '%',               
        );   

        $strComparison = ' LIKE ';
      }  
      elseif(!$strDs && $strDs2){
        $arrOptions['where_clause'] = array(
          't.ds_turma'       => '%' . $strDs2 . '%',         
        );   

        $strComparison = ' LIKE ';
      }  
      else{
        $arrOptions['where_clause'] = array(
          '1' => '1'         
        );   

        $strComparison = ' = ';
      }
      
		$strSql = $this->_get($arrOptions, $strComparison);
       
      $objResult = $this->getAdapter()->fetchAll($strSql);            
      return Core_Commons::onLoad($objResult);
    }
    
    public function getByModulo($intIdModulo){
    	//$this->getColunas();
    	$this->getLimitField('nr_limit');
    	
    	$arrOptions['fields'] = array(
        't.idTurma',
        't.ds_turma',
    	  'total'  => 'COUNT(a.idTurma)', 
      );
      
      $arrOptions['where_clause'] = array(
        'mt.idModulo'  => $intIdModulo,
      );
      
    	$strSql = $this->_get($arrOptions)
      ->join(array('mt' =>  'modulos_turmas'), 'mt.idTurma = t.idTurma', array()) 
      ->join(array('m'  =>  'modulos'), 'm.idModulo = mt.idModulo', array())
      ->joinLeft(array('a' => 'alunos'), 'a.idTurma = t.idTurma', array())
      ->having('total <= (' . $this->select()->from($this->_name, 'nr_limit')->join('alunos', 'alunos.idTurma = turmas.idTurma', array()). ')')
      ; 
      
      $objResult = $this->getAdapter()->fetchAll($strSql);
        
      return Core_Commons::onLoad($objResult);
    }
    
    public function getColunas(){
      $arrResult = array();
      $arrCols = $this->fetchAll()->getTable()->_metadata;
      
      Zend_Debug::dump($arrCols);
      
      $arrResult[strtoupper($this->_name)] = $arrCols;
      return Core_Commons::onLoad($arrResult);
    }
    
    public function getLimitField($strFieldName){
    	$arrCols = $this->fetchAll()->getTable()->_metadata;
      return $arrCols[$strFieldName]['DEFAULT'];
    }
    
  /**
     * Realiza a validação dos dados vindo do formulário
     * 
     * @return void.
     */
    public function validaForm(){
      $objValida = new Core_ValidaFormulario();
      $arrFilters = array('*' =>  'StringTrim');
      $arrOptions = array('allowEmpty' =>  true);
      
      $arrValidators = array(
        'Sigla'             =>  array('allowEmpty'  => false, 'fields'  => 'ds_sigla'),
        'Turma'             =>  array('allowEmpty'  => false, 'fields'  => 'ds_turma'),
        'Módulo'            =>  array('allowEmpty'  => false, 'fields'  => 'idModulo'),
        'Sala'              =>  array('allowEmpty'  => false, 'fields'  => 'idSala'),
        'Periodo'           =>  array('allowEmpty'  => false, 'fields'  => 'idPeriodo'),
        'Máximo de Alunos'  =>  array('allowEmpty'  => false, 'fields'  => 'nr_limit'),
        'Status'            =>  array('allowEmpty'  => false, 'fields'  => 'ds_situacao'),
      );
      
      return $objValida->validaFormulario($arrFilters, $arrValidators, $arrOptions);;
    }
    
    /**
     * Salva um registro. Funcionalidade para inserção e atualização
     * @param integer Id do registro. Se for diferente de null, então será atualizado o regsitro
     * a partir do id, senão será inserido um novo registro.
     * 
     * @return boolean.
     */
    public function salvar($intIdTurma = null, $intIdModulo = null){
      $objValida = new Core_ValidaFormulario();
      $objDadosInput = $this->validaForm();
      $arrDados['ds_sigla']     = strtoupper($objDadosInput->ds_sigla);
      $arrDados['ds_turma']     = strtoupper($objDadosInput->ds_turma);
      $arrDados['idSala']       = strtoupper($objDadosInput->idSala);
      $arrDados['idPeriodo']    = strtoupper($objDadosInput->idPeriodo);
      $arrDados['nr_limit']     = strtoupper($objDadosInput->nr_limit);
      $arrDados['ds_situacao']  = strtoupper($objDadosInput->ds_situacao);
      
      $arrDadosMT['idModulo'] = $objDadosInput->idModulo;
      
      if($intIdTurma == null && $intIdCurso == null){
        $arrDados['dt_insercao']    = date('Y-m-d H:i:s');
        $arrDados['dt_atualizacao'] = 'NULL';
            
        $strSql = $this->select()
        ->where("ds_sigla = ?", $arrDados['ds_sigla'])
       	->orWhere("ds_turma = ?", $arrDados['ds_turma']);
        
        if($this->fetchAll($strSql)->current())
          throw new Exception('Turma já cadastrada com o nome "' . $arrDados['ds_turma'] . '" ou com a sigla "' . $arrDados['ds_sigla'] . '"!', '3');
        else{
        	if($this->insert($arrDados)){
        		$arrDadosMT['idTurma'] = $this->getAdapter()->lastInsertId($this->_name, 'idTurma');
            
            return $this->getAdapter()->insert('modulos_turmas', $arrDadosMT);
        	}
          else
           throw new Exception('Não foi possível inserir o curso', '4');
        }  
      }
      else{ 
      	$arrDados['dt_atualizacao'] = date('Y-m-d H:i:s');
        $this->update($arrDados, 'idTurma = ' . $intIdTurma);  
        
        $this->getAdapter()->update('modulos_turmas', $arrDadosMT, " idTurma = {$intIdTurma} AND idModulo = {$intIdModulo}")
        ;
        return true;
      }
    }
    
    /**
     * Exclui um registro  a partir do banco de dados. 
     * Um registro nunca será ecluido do banco de dados.
     * Considera-se excluído um registro com status igual a "0".
     * 
     * @param integer  id para a clausula where.
     * @return boolean.
     */
    public function excluir($intId){
      $boolReturn = false;
      $objDadosInput = $this->validaForm();
      
      $strWhere = "idTurma = '" . $intId . "'";
      $arrDados['ds_situacao'] = self::IND_INATIVO; 
      $arrDados['dt_atualizacao'] = date('Y-m-d H:i:s');
            
      if($this->update($arrDados, $strWhere))  
        $boolReturn = true;
      
      return $boolReturn; 
      
    }
  }  